package com.adcc.ags.gms.mq.service;

import com.adcc.ags.gms.mq.entity.Queue;
import com.adcc.ags.gms.mq.vo.QueueVO;
import com.github.pagehelper.PageInfo;
import com.google.common.base.Optional;

import java.util.List;
import java.util.Map;

/**
 * 队列服务层
 */
public interface QueueService {

    /**
     * 查询所有系统队列
     * @return
     */
    public Optional<List<QueueVO>> findAllSysQueue();

    /**
     * 查询所有源用户队列
     * @return
     */
    public Optional<List<QueueVO>> findAllSourceUserQueue();

    /**
     * 查询所有目标用户队列
     * @return
     */
    public Optional<List<QueueVO>> findAllTargetUserQueue();

    /**
     * 根据队列ID查找
     * @param id
     * @return
     */
    public Queue findQueueById(Long id);

    /**
     * 根据队列名称查询用户队列
     * @param name
     * @param curPage
     * @param pageSize
     * @return
     */
    public Optional<PageInfo<Queue>> findUserQueueByName(String name,int curPage,int pageSize);

    /**
     * 根据是否生效查询队列
     * @param effect
     * @return
     */
    public Optional<List<QueueVO>> findUserQueueByEffect(boolean effect);

    /**
     * 是否存在队列名称
     * @param name
     * @return
     */
    public Optional<Boolean> isExistQueueName(String name);

    /**
     * 新增数据
     * @param vo
     * @return
     */
    public Optional<Boolean> createQueue(QueueVO vo);

    /**
     * 更新队列
     * @param vo
     * @return
     */
    public Optional<Boolean> updateQueue(QueueVO vo);

    /**
     * 删除队列
     * @param id
     * @return
     */
    public Optional<Boolean> deleteQueue(long id);


    /**
     * 生效队列
     * @param id
     * @return
     */
    public Optional<Boolean> onEnable(long id);

    /**
     * 失效队列
     * @param id
     * @return
     */
    public Optional<Boolean> onDisable(Long id);

    /**
     * 分析同步队列
     * @return
     */
    public Optional<Map<String,List<QueueVO>>> analyzeSyncQueue();

    /**
     * 同步队列
     * @param newList
     * @param diffList
     * @return
     */
    public Optional<Boolean> syncQueue(List<QueueVO> newList,List<QueueVO> diffList);

    /**
     * 清除队列
     * @param name
     * @return
     */
    public Optional<Boolean> clearQueue(String name);

    /**
     * 查询队列当前深度
     * @param id
     * @return
     */
    public long queueCurrentDepth(long id);
}
